-- file: lua/Halt.lua
 
local http = require 'http'
local backend = require 'backend'
 
 
local char = string.char
local byte = string.byte
local find = string.find
local sub = string.sub
 
local ADDRESS = backend.ADDRESS
local PROXY = backend.PROXY
local DIRECT_WRITE = backend.SUPPORT.DIRECT_WRITE
 
local SUCCESS = backend.RESULT.SUCCESS
local HANDSHAKE = backend.RESULT.HANDSHAKE
local DIRECT = backend.RESULT.DIRECT
 
local ctx_uuid = backend.get_uuid
local ctx_proxy_type = backend.get_proxy_type
local ctx_address_type = backend.get_address_type
local ctx_address_host = backend.get_address_host
local ctx_address_bytes = backend.get_address_bytes
local ctx_address_port = backend.get_address_port
local ctx_write = backend.write
local ctx_free = backend.free
local ctx_debug = backend.debug
 
local is_http_request = http.is_http_request
 
local flags = {}
local marks = {}
local kHttpHeaderSent = 1
local kHttpHeaderRecived = 2
 
function wa_lua_on_flags_cb(ctx)
   return 0
end
 
function wa_lua_on_handshake_cb(ctx)
   local uuid = ctx_uuid(ctx)
 
   if flags[uuid] == kHttpHeaderRecived then
       return true
   end
   
   local res = nil
   
 
   if flags[uuid] ~= kHttpHeaderSent then
       local host = ctx_address_host(ctx)
       local port = ctx_address_port(ctx)
       
 
       res = 'CONNECT ' .. host .. ':' .. port ..'@a.189.cn HTTP/1.1\r\n' ..
                   'Host: a.189.cn\r\n' ..
                   'Proxy-Connection: Keep-Alive\r\n'..
                   'X-T5-Auth: ZjQxNDIh\r\nX-Cuid: CA3712213 D9767572 D93E28B3D847C82|551897060456953\r\n' ..
                   'User-Agent: baiduboxapp\r\n\r\n'
         
       ctx_write(ctx, res)
       flags[uuid] = kHttpHeaderSent
   end
 
   return false
end
 
function wa_lua_on_read_cb(ctx, buf)
 
   local uuid = ctx_uuid(ctx)
   if flags[uuid] == kHttpHeaderSent then
       flags[uuid] = kHttpHeaderRecived
       return HANDSHAKE, nil
   end
 
   return DIRECT, buf
end
 
function wa_lua_on_write_cb(ctx, buf)
 
   local host = ctx_address_host(ctx)
   local port = ctx_address_port(ctx)
   
   if ( is_http_request(buf) == 1 ) then
           local index = find(buf, '/')
           local method = sub(buf, 0, index - 1)
           local rest = sub(buf, index)
           local s, e = find(rest, '\r\n')
           
           local less = sub(rest, e + 1)
           local s1, e1 = find(less, '\r\n')
 
           buf = method .. sub(rest, 0, e) ..  
           'X-Online-Host:\t\t ' .. host ..'\r\n' ..
           'Host: a.189.cn\r\n'..
           'User-Agent: baiduboxapp\r\n\r\n'
 'User-Agent: baiduboxapp\r\n\r\n' ..
           sub(rest, e + 1)
           
   end
   
   return DIRECT, buf
end
 
function wa_lua_on_close_cb(ctx)
   local uuid = ctx_uuid(ctx)
   flags[uuid] = nil
   ctx_free(ctx)
   return SUCCESS
end